#include "InfomationCurve2DBasical.h"
#include "TextFileParser.h"

namespace pst
{
    bool InfomationCurve2DBasical::getCommonData(
        const QList<InfomationCurve2DBasical>& dataList,
        InfomationCurve2DBasical& commonInfo)
    {
        if (dataList.isEmpty())
        {
            // TODO 警告
            return false;
        }
        if (dataList.size() == 1)
        {
            commonInfo = dataList[0];
            return true;
        }

        commonInfo.setIsMuti(true);
        //有多个曲线被选择->只判断 扫描参数（变量轴），DB和归一化。
        // 固定值和value列，直接置空
        //InfomationCurve2DBasical temp;
        bool hasCommonScanParameter = true;
        //TODO 不应该使用下标，同一个扫描参数在不同文件中下标可能不同, 应该改为名字？
        auto scanParameterIndex = dataList[0].getScanParameterIndex();
        //auto OtherkeySet = dataList[0].getOtherKeyData().toList().toSet();//顺序可能有不同
        //bool isValueIndexSame{ true };
        //auto valueIndex = dataList[0].getValueIndex();

        //bool isAllOtherKeySame = true;

        //以第一个为比较基准
        int scanIndex0 = dataList[0].getScanParameterIndex();
        auto reader0 = dataList[0].getReader();
        QVector<QString> keyNameList0 = reader0->getEachColNameOfKey();
        QString scanName0 = keyNameList0[dataList[0].getScanParameterIndex()];

        int isAllNormalizedTrueCount = 0;
        int isAllNirmalized = true;

        int isAllDBTrueCount = 0;
        int isAllDB = true;

        QList<QVector<QString>> AllkeyNameList;
        for (const auto& i : dataList)
        {
            //TODO 提取共同的扫描参数？
            int scanIndex = i.getScanParameterIndex();
            auto reader = i.getReader();
            if (scanIndex < 0)
            {
                //TODO 警告 正常是不会出现的
                return false;
            }
            if (reader == nullptr)
            {
                //TODO 警告 InfomationCurve2DBasical类必须是读了文件并添加后才会使用，必须含有reader
                return false;
            }
            QVector<QString> keyNameList = reader->getEachColNameOfKey();
            AllkeyNameList.append(keyNameList);

            if (i.getIsNormalized() == true)
            {
                isAllNormalizedTrueCount++;
            }
            if (i.getIsDB() == true)
            {
                isAllDBTrueCount++;
            }

        }

        /// 扫描参数
        // 有公共的key,并且扫描参数一致（与第一个一致）
        QList<QString> commonKeyNameList = findCommonStrings(AllkeyNameList);
        if (commonKeyNameList.contains(scanName0))
        {
            commonInfo.setCommonFixedNames(commonKeyNameList);
            //使用第一个曲线的信息（commonInfo的reader只用于将扫描参数下标转为名字）
            commonInfo.setScanParameterIndex(scanIndex0);
            commonInfo.setReader(reader0);
        }
        else
        {
            commonInfo.setScanParameterIndex(-1);
        }

        /// 固定值 清空
        commonInfo.setOtherKeyData(QVector<double>());
        commonInfo.setValueIndex(-1);


        if (isAllNormalizedTrueCount == dataList.size())
        {
            isAllNirmalized = 1;
        }
        else if (isAllNormalizedTrueCount == 0)
        {
            isAllNirmalized = 0;
        }
        else
        {
            isAllNirmalized = -1;

        }

        if (isAllDBTrueCount == dataList.size())
        {
            isAllDB = 1;
        }
        else if (isAllDBTrueCount == 0)
        {
            isAllDB = 0;
        }
        else
        {
            isAllDB = -1;

        }

        //temp.setHasCommonScanParameter(hasCommonScanParameter);
        //temp.setIsAllOtherKeySame(isAllOtherKeySame);
        //temp.setValueIndexSame(isValueIndexSame);
        commonInfo.setIsNormalized(isAllNirmalized);
        commonInfo.setIsDB(isAllDB);
        //if (hasCommonScanParameter) //只有在有扫描参数相同的情况下才应该使用相同的扫描参数
        //{
        //    temp.setScanParameterIndex(dataList[0].getScanParameterIndex());
        //}
        //if (isAllOtherKeySame) //只有在其他Key全部相同的情况下才应该使用
        //{
        //    temp.setOtherKeyData(temp.getOtherKeyData());
        //}
        //if (isValueIndexSame) //只有在valueIndex相同的情况下才应该使用
        //{
        //    temp.setValueIndex(valueIndex);
        //}
        return true;
    }
}